package studio.beamy.db.dao;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import studio.beamy.db.profile.DBConnectionSetup;

public class Dao
{
    private final String className ;
	private List<?> entities;    
    public static final ThreadLocal<Session> threadSession = new ThreadLocal<Session>();
    
    public Dao(Class<?> clazz)
    {
    	className=clazz.getName();
    }
    
	public Session open(DBConnectionSetup ds) throws Exception
	{
		try
		{		
			Session ss = (Session)threadSession.get();
			if (ss == null)
			{
				SessionFactory sf = SessionFactoryUtil.getInstance().buildByHibernate(ds);
				ss = sf.openSession();
				threadSession.set(ss);
			}
			return ss;
		}
		catch (Exception e)
		{
			throw e;
		}
	}
    
    public void close() throws Exception
    {
        Session session = (Session) threadSession.get();
        if (session != null && session.isOpen())
        	session.close();
        threadSession.set(null);
    }
    

	
    public List<?> getDataSet() throws Exception
    {
    	Session session = (Session) threadSession.get();
        Query query = session.createQuery(generateQueryString("",""));
        this.entities = (List<?>)query.list();        
        return entities;
    }
    
//    public List<?> getDataSet(DataSourceEnum datasource) throws Exception
//    {
//        session=this.open(datasource);
//        Query query = session.createQuery(generateQueryString("",""));
//        this.entities = (List<?>)query.list();        
//        return entities;
//    }
    
//    protected List<?> getDataSet(String sql) throws Exception
//    {
//        session=this.open();
//        Query query = session.createQuery(sql);
//        this.entities = (List<?>)query.list();        
//        return entities;
//    }    
//
//    public List<?> getDataSetOrderby(String orderby) throws Exception
//    {
//        return getDataSetOrderby(orderby,false);
//    } 
//    
//    public List<?> getDataSetOrderby(String orderby,Boolean asc) throws Exception
//    {
//        session=this.open();
//        Query query ;
//        if (asc)
//        {
//        	query = session.createQuery(generateQueryString("",orderby+" asc"));
//        }
//        else
//        	query = session.createQuery(generateQueryString("",orderby+" desc"));
//        this.entities = (List<?>)query.list();    
//        return entities;
//    } 
//    
//    public Object getData(String id) throws Exception
//    {
//        //session=proxy.open();
//        session=this.open();
//        Query query = session.createQuery(generateQueryString("id=:id",""));
//        Object entity = null ;
//        query.setString("id", id);
//        this.entities = query.list();        
//        if (entities.size() == 1)
//        {
//            entity = entities.get(0); 
//        }            
//        return entity;        
//    }
//    
//    protected Object getDataBySql(String sql) throws Exception
//    {
//        session=this.open();
//        Query query = session.createQuery(sql);
//        Object entity = null ;
//        this.entities = query.list();        
//        if (entities.size() >= 1)
//        {
//            entity = entities.get(0); 
//        }            
//        return entity;        
//    }
//    
//    public boolean save(Object entity) throws Exception
//    {
//        session=this.open();
//        Transaction tx = session.beginTransaction();
//        session.save(entity);
//        session.flush();
//        tx.commit();
//        this.close();        
//        return true;
//    }
//    
//    public boolean remove(Object entity) throws Exception
//    {
//        session=this.open();
//        Transaction tx = session.beginTransaction();
//        session.delete(entity);
//        session.flush();
//        tx.commit();
//        this.close();        
//        return true;
//    }    
//	
//    public boolean remove(List<Object> entity) throws Exception
//    {
//        session=this.open();
//        Transaction tx = session.beginTransaction();
//        for (Object obj:entity)
//        {
//        	session.delete(obj);        	
//        }
//        session.flush();
//        tx.commit();
//        this.close();        
//        return true;
//    }   
//    
//    public boolean SaveorUpdate(Object entity) throws Exception
//    {
//        session=this.open();
//        Transaction tx = session.beginTransaction();
//        session.saveOrUpdate(entity);
//        session.flush();
//        tx.commit();
//        this.close();        
//        return true;
//    } 
//    
	protected String generateQueryString(String where, String orderBy)
	{
		return generateQueryString(where, orderBy, "FROM");
	}

	protected String generateQueryString(String where, String orderBy,String opt)
	{
		final StringBuffer sb = new StringBuffer(256);
		sb.append(opt+ " " + className);
		if (where!=null && !"".equalsIgnoreCase(where))
		{
			sb.append(" WHERE " + where);
		}
		if (orderBy!=null && !"".equalsIgnoreCase(orderBy))
		{
			sb.append(" ORDER BY " + orderBy);
		}
		return sb.toString();
	}
//	
//	public void setLog(Logger log)
//	{
//		DaoTemplet.log = log;
//	}
//
//	public String getPropertyFile()
//	{
//		return propertyFile;
//	}
//
//	public static void setPropertyFile(String propertyfile)
//	{
//		propertyFile = propertyfile;
//	}
//
//	public boolean isDebugMode()
//	{
//		return debugMode;
//	}
//
//	public static void setDebugMode(boolean debugFlag)
//	{
//		debugMode = debugFlag;
//	}
}